/*
 *  DAO para funções de acesso publico
 */
package AcessoBD;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;
import Modelos.BeanMembro;
import Modelos.BeanPublicacao;
import Utilidades.ExpedidorDeEmail;
import Utilidades.GeradorDeSenha;
import Utilidades.GeradorDeHash;

public class PublicoApeteDAO {

    public List<BeanPublicacao> listaGeral() throws DAOException {
        List<BeanPublicacao> listaGeral = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL listar_destaque();";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);
            listaGeral = new ArrayList<BeanPublicacao>();

            while (rs.next() && listaGeral.size() < 10) {
                int idPublicacao = rs.getInt("id_publicacao");
                int idMembro = rs.getInt("id_membro");
                String titulo = rs.getString("titulo");
                String resumo = rs.getString("resumo");
                Date dataPublicacao = rs.getDate("data_publicacao");
                String categoria = rs.getString("categoria");
                String tipo = rs.getString("tipo");
                boolean cadastravel = false;


                BeanPublicacao pub = new BeanPublicacao(
                        idPublicacao,
                        idMembro,
                        null,
                        titulo,
                        resumo,
                        null,
                        dataPublicacao,
                        categoria,
                        tipo,
                        cadastravel);

                listaGeral.add(pub);
            }

            sql = "CALL listar_publicacao();";

            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            while (rs.next() && listaGeral.size() < 10) {
                int idPublicacao = rs.getInt("id_publicacao");
                int idMembro = rs.getInt("id_membro");
                String titulo = rs.getString("titulo");
                String resumo = rs.getString("resumo");
                Date dataPublicacao = rs.getDate("data_publicacao");
                String categoria = rs.getString("categoria");
                String tipo = rs.getString("tipo");
                boolean cadastravel = false;

                BeanPublicacao pub = new BeanPublicacao(
                        idPublicacao,
                        idMembro,
                        null,
                        titulo,
                        resumo,
                        null,
                        dataPublicacao,
                        categoria,
                        tipo,
                        cadastravel);

                listaGeral.add(pub);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            if (listaGeral != null && listaGeral.isEmpty()) {
                listaGeral = null;
            }
            return listaGeral;
        }
    }

    public List<BeanPublicacao> listaArtigo() throws DAOException {
        List<BeanPublicacao> listaArtigo = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL listar_artigo();";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);
            listaArtigo = new ArrayList<BeanPublicacao>();

            while (rs.next()) {
                int idPublicacao = rs.getInt("id_publicacao");
                int idMembro = rs.getInt("id_membro");
                String titulo = rs.getString("titulo");
                String resumo = rs.getString("resumo");
                Date dataPublicacao = rs.getDate("data_publicacao");
                String categoria = rs.getString("categoria");
                String tipo = rs.getString("tipo");
                boolean cadastravel = false;

                BeanPublicacao pub = new BeanPublicacao(
                        idPublicacao,
                        idMembro,
                        null,
                        titulo,
                        resumo,
                        null,
                        dataPublicacao,
                        categoria,
                        tipo,
                        cadastravel);

                listaArtigo.add(pub);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            if (listaArtigo != null && listaArtigo.isEmpty()) {
                listaArtigo = null;
            }
            return listaArtigo;
        }
    }

    public List<BeanPublicacao> listaEvento() throws DAOException {
        List<BeanPublicacao> listaEvento = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL listar_evento();";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);
            listaEvento = new ArrayList<BeanPublicacao>();

            while (rs.next()) {
                int idPublicacao = rs.getInt("id_publicacao");
                int idMembro = rs.getInt("id_membro");
                String titulo = rs.getString("titulo");
                String resumo = rs.getString("resumo");
                Date dataPublicacao = rs.getDate("data_publicacao");
                String categoria = rs.getString("categoria");
                String tipo = rs.getString("tipo");
                boolean cadastravel = false;

                BeanPublicacao pub = new BeanPublicacao(
                        idPublicacao,
                        idMembro,
                        null,
                        titulo,
                        resumo,
                        null,
                        dataPublicacao,
                        categoria,
                        tipo,
                        cadastravel);

                listaEvento.add(pub);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            if (listaEvento != null && listaEvento.isEmpty()) {
                listaEvento = null;
            }
            return listaEvento;
        }
    }

    public List<BeanPublicacao> listaBiblioteca() throws DAOException {
        List<BeanPublicacao> listaBiblioteca = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL listar_biblioteca();";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);
            listaBiblioteca = new ArrayList<BeanPublicacao>();

            while (rs.next()) {
                int idPublicacao = rs.getInt("id_publicacao");
                int idMembro = rs.getInt("id_membro");
                String titulo = rs.getString("titulo");
                String resumo = rs.getString("resumo");
                Date dataPublicacao = rs.getDate("data_publicacao");
                String categoria = rs.getString("categoria");
                String tipo = rs.getString("tipo");
                boolean cadastravel = false;

                BeanPublicacao pub = new BeanPublicacao(
                        idPublicacao,
                        idMembro,
                        null,
                        titulo,
                        resumo,
                        null,
                        dataPublicacao,
                        categoria,
                        tipo,
                        cadastravel);

                listaBiblioteca.add(pub);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            if (listaBiblioteca != null && listaBiblioteca.isEmpty()) {
                listaBiblioteca = null;
            }
            return listaBiblioteca;
        }
    }
    
    public BeanPublicacao lerPublicacao(String pubId) throws DAOException {
        BeanPublicacao pub = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL publicacao_completa('" + pubId + "');";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            if (rs.next()) {
                int idPublicacao = rs.getInt("id_publicacao");
                int idMembro = rs.getInt("id_membro");
                String nomeAutor = rs.getString("nome");
                String titulo = rs.getString("titulo");
                String resumo = rs.getString("resumo");
                String info = rs.getString("info");
                Date dataPublicacao = rs.getDate("data_publicacao");
                String categoria = rs.getString("categoria");
                String tipo = rs.getString("tipo");
                boolean cadastravel = false;

                if (categoria.contentEquals("EV")) {
                    cadastravel = rs.getBoolean("cadastravel");
                }

                pub = new BeanPublicacao(
                        idPublicacao,
                        idMembro,
                        nomeAutor,
                        titulo,
                        resumo,
                        info,
                        dataPublicacao,
                        categoria,
                        tipo,
                        cadastravel);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return pub;
        }
    }

    public BeanMembro infoMembro(String membroId) throws DAOException {
        BeanMembro membro = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL info_membro('" + membroId + "');";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            if (rs.next()) {
                int idMembro = rs.getInt("id_membro");
                String nome = rs.getString("nome");
                String titulo = rs.getString("login");
                String resumo = rs.getString("email");
                String info = rs.getString("info");
                boolean admin = rs.getBoolean("admin");

                membro = new BeanMembro(
                        idMembro,
                        nome,
                        titulo,
                        resumo,
                        info,
                        admin);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return membro;
        }
    }

    public List<BeanMembro> listaMembro() throws DAOException {
        List<BeanMembro> listaMembro = null;
        BeanMembro membro = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL listar_membros();";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);
            listaMembro = new ArrayList<BeanMembro>();

            while (rs.next()) {
                int idMembro = rs.getInt("id_membro");
                String nome = rs.getString("nome");
                boolean admin = rs.getBoolean("admin");

                membro = new BeanMembro(
                        idMembro,
                        nome,
                        null,
                        null,
                        null,
                        admin);

                listaMembro.add(membro);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return listaMembro;
        }
    }

    public String conteudoInstitucional() throws DAOException {
        String conteudo = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL conteudo_institucional();";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            if (rs.next()) {
                conteudo = rs.getString("institucional");
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return conteudo;
        }
    }

    public String conteudoContato() throws DAOException {
        String conteudo = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL conteudo_contato();";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            if (rs.next()) {
                conteudo = rs.getString("contato");
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return conteudo;
        }
    }

    public BeanMembro logarMembro(String login, String senha) throws DAOException {
        BeanMembro membro = null;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        GeradorDeHash geradorHash = new GeradorDeHash();
        String hash = geradorHash.gerarHash(senha);

        String sql = "CALL logar_membro('" + login + "','" + hash + "');";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            if (rs.next()) {
                int novoIdMembro = rs.getInt("id_membro");
                String novoNome = rs.getString("nome");
                String novoLogin = rs.getString("login");
                String novoEmail = rs.getString("email");
                String novoInfo = rs.getString("info");
                boolean novoAdmin = rs.getBoolean("admin");

                membro = new BeanMembro(
                        novoIdMembro,
                        novoNome,
                        novoLogin,
                        novoEmail,
                        novoInfo,
                        novoAdmin);
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return membro;
        }
    }

    public boolean lembrarMembro(String email, String cpf) throws DAOException {
        boolean erro = true;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        String sql = "CALL lembrar_membro('" + email + "','" + cpf + "');";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            if (rs.next()) {
                String membroNome = rs.getString("nome");
                String membroLogin = rs.getString("login");

                GeradorDeSenha geradorSenha = new GeradorDeSenha();
                GeradorDeHash geradorHash = new GeradorDeHash();

                String senha = geradorSenha.gerarSenha();
                String senhaHash = geradorHash.gerarHash(senha);

                factory.closeConnection(stm, rs);
                sql = "CALL trocar_pass('" + email + "','" + senhaHash + "');";

                conn = factory.getNormalConnection();
                stm = conn.createStatement();
                rs = stm.executeQuery(sql);

                String assunto = "Lembrar login/senha";
                String conteudo = "Olá " + membroNome + ","
                        + "\n\nVocê solicitou esta mensagem com seus dados de login."
                        + "\n\nFoi gerada uma nova senha para você. Para sua segurança,"
                        + " queira alterá-la assim que acessar a Área do Membro."
                        + "\n\nSeu login e nova senha de acesso são:"
                        + "\n\nLOGIN: " + membroLogin
                        + "\nSENHA: " + senha
                        + "\n";

                ExpedidorDeEmail expedidorEmail = new ExpedidorDeEmail();
                expedidorEmail.enviarEmail(
                        email,
                        membroNome,
                        assunto,
                        conteudo);

                erro = false;
            }

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return erro;
        }
    }

    public boolean assinarNewsletter(String nome, String email) throws DAOException {
        boolean erro = true;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        GeradorDeSenha geradorSenha = new GeradorDeSenha();
        GeradorDeHash geradorHash = new GeradorDeHash();

        String senha = geradorSenha.gerarSenha();
        String senhaHash = geradorHash.gerarHash(senha);

        String sql = "CALL assinar('" + email + "','" + nome + "','" + senhaHash + "');";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            String assunto = "Assinatura de Publicações APETE CAAPUÃ";
            String conteudo = "Olá " + nome + ","
                    + "\n\nVocê solicitou assinatura das publicações do Núcleo de"
                    + " Agroecologia APETE CAAPUÃ."
                    + "\n\nSe optar por cancelar sua assinatura, acesse o endereço"
                    + " www.sorocaba.ufscar.br/apete_caapua/cancelar_assinatura.jsp"
                    + " insira seu e-mail e o código de segurança abaixo."
                    + "\n\nCODIGO DE SEGURANÇA: " + senha
                    + "\n\nGUARDE SEU CÓDIGO DE SEGURANÇA, SÓ É POSSÍVEL CANCELAR ASSINATURAS"
                    + " DE FORMA AUTOMÁTICA COM O CÓDIGO DE SEGURANÇA EM MÃOS."
                    + "\n\nCaso o procedimento acima não funcione, entre em contato com algum dos membros administradores do sistema solicitando o cancelamento de sua assinatura."
                    + "\n";

            ExpedidorDeEmail expedidorEmail = new ExpedidorDeEmail();
            expedidorEmail.enviarEmail(
                    email,
                    nome,
                    assunto,
                    conteudo);

            erro = false;

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return erro;
        }
    }

    public boolean cancelarNewsletter(String email, String codigo) throws DAOException {
        boolean erro = true;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        GeradorDeHash geradorHash = new GeradorDeHash();
        String codigoHash = geradorHash.gerarHash(codigo);

        String sql = "CALL cancelar_assinatura('" + email + "','" + codigoHash + "');";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            erro = false;

        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return erro;
        }
    }

    public boolean codigoSeguranca(String email) throws DAOException {
        boolean erro = true;
        ConnectionFactory factory = new ConnectionFactory();
        Connection conn = null;
        Statement stm = null;
        ResultSet rs = null;

        GeradorDeSenha geradorSenha = new GeradorDeSenha();
        GeradorDeHash geradorHash = new GeradorDeHash();

        String codigo = geradorSenha.gerarSenha();
        String codigoHash = geradorHash.gerarHash(codigo);

        String sql = "CALL codigo_assinatura('" + email + "','" + codigoHash + "');";

        try {
            conn = factory.getNormalConnection();
            stm = conn.createStatement();
            rs = stm.executeQuery(sql);

            if (rs.next()) {
                String nome = rs.getString("nome");
                String assunto = "Novo Código de Segurança";
                String conteudo = "Olá " + nome + ","
                        + "\n\nVocê solicitou um novo Código de Segurança para"
                        + " cancelar sua assinatura de publicações."
                        + "\n\nPara cancelar sua assinatura, acesse o endereço "
                        + " www.sorocaba.ufscar.br/apete_caapua/cancelar_assinatura.jsp"
                        + " insira seu e-mail e o código de segurança abaixo."
                        + "\n\nNOVO CODIGO DE SEGURANÇA: " + codigo
                        + "\n\nA partir deste momento, o Código de Segurança antigo não existe mais."
                        + "\nGUARDE SEU CÓDIGO DE SEGURANÇA, SÓ É POSSÍVEL CANCELAR ASSINATURAS"
                        + " DE FORMA AUTOMÁTICA COM O CÓDIGO DE SEGURANÇA EM MÃOS."
                        + "\n\nCaso o procedimento acima não funcione, entre em contato com algum dos membros administradores do sistema solicitando o cancelamento de sua assinatura."
                        + "\n";

                ExpedidorDeEmail expedidorEmail = new ExpedidorDeEmail();
                expedidorEmail.enviarEmail(
                        email,
                        nome,
                        assunto,
                        conteudo);

                erro = false;

            }
        } catch (SQLException sqle) {
            sqle.printStackTrace();
        } finally {
            factory.closeConnection(stm, rs);
            return erro;
        }
    }
}
